home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 5 / The 640 Meg Shareware Studio CD-ROM Volume V (Data Express)(1994).ISO / amiga / showrv19.lha / showrev.c < prev    next >
C/C++ Source or Header  |  1994-03-02  |  13KB  |  495 lines

  1. ;/* execute me to compile
  2. dcc showrev.c -proto -mi -r -mRR
  3. quit
  4. */
  5.  
  6. /*
  7.  * ShowRev
  8.  *
  9.  * copyright 1994 by Christof Damian
  10.  *
  11.  * $Id: showrev.c,v 1.9 1994/03/02 18:32:05 damian Exp damian $
  12.  *
  13.  * $Source: Wⁿrg:home/damian/cc/RCS/showrev.c,v $
  14.  *
  15.  * $Revision: 1.9 $
  16.  *
  17.  * $Author: damian $
  18.  *
  19.  * $Log: showrev.c,v $
  20.  * Revision 1.9  1994/03/02  18:32:05  damian
  21.  * cosmetics
  22.  *
  23.  * Revision 1.8  1994/03/02  18:22:08  damian
  24.  * can take qualified now (instead of only filenames)
  25.  *
  26.  * Revision 1.7  1994/02/21  16:00:55  damian
  27.  * added fix for $VER without leading \0
  28.  *
  29.  * Revision 1.6  1994/02/09  12:30:18  damian
  30.  * better check between ident/Version
  31.  *
  32.  * Revision 1.5  1994/02/08  20:05:56  damian
  33.  * changed uident-check a little bit
  34.  *
  35.  * Revision 1.4  1994/02/03  17:17:12  damian
  36.  * added check for fileinfoblock (date,comment,flags)
  37.  *
  38.  * Revision 1.3  1994/02/02  20:36:27  damian
  39.  * changed uident-check, so it won't show up in ShowRev
  40.  *
  41.  * Revision 1.2  1994/02/02  20:33:43  damian
  42.  * added Id string
  43.  *
  44.  * Revision 1.1  1994/02/02  20:31:37  damian
  45.  * Initial revision
  46.  */
  47.  
  48. /*** C= includes ***/
  49.  
  50. #include <exec/types.h>
  51. #include <exec/memory.h>
  52. #include <dos/dosextens.h>
  53. #include <dos/stdio.h>
  54.  
  55. /*** DICE - includes ***/
  56.  
  57. #include <strings.h>
  58. #include <ctype.h>
  59.  
  60. /*** library bases & protopragmas ***/
  61.  
  62. extern struct DosLibrary *DOSBase;
  63. #define DOSBase_DECLARED
  64.  
  65. #include <proto/exec_protos.h>
  66. #include <proto/dos_protos.h>
  67.  
  68. /*** global #defines ***/
  69.  
  70. #define Prototype GLOBAL
  71. #define Local     STATIC
  72. #define CONST
  73.  
  74. struct PBLE
  75.    {
  76.    BPTR Next;
  77.    ULONG DirLock;
  78.    };
  79.  
  80. /*** prototypes of this file ***/
  81.  
  82. Local VOID Fail(char *text);
  83. Local VOID Warning(char *text);
  84. Local BOOL CheckResidentList(char *name,BOOL system);
  85. Local BOOL CheckVersion(char *dir,char *file);
  86. Local BOOL CheckVersionMulti(char *dir,char *file);
  87. Prototype int main(int argc_notused,char **argv_notused);
  88.  
  89. #ifndef __COMMODORE_DATE__
  90. #define __COMMODORE_DATE__ __DATE__
  91. #endif
  92.  
  93. #define BASENAME     "ShowRev"
  94. #define MAXPATHLEN   512
  95. #define MAXLINELEN   512
  96.  
  97. /*** for C= Version or ShowRev ***/
  98.  
  99. CONST STATIC char VER[] = "\0$VER: " BASENAME " 1.9 (" __COMMODORE_DATE__ ")";
  100. CONST STATIC char Basename[] = BASENAME;
  101. CONST STATIC char Id[] = "$Id: showrev.c,v 1.9 1994/03/02 18:32:05 damian Exp damian $";
  102.  
  103. BOOL CheckAll = FALSE;        /* checks all found files */
  104. BOOL Verbose = FALSE;         /* verbose output */
  105.  
  106. int ReturnCode = RETURN_OK;   /* main() return code */
  107.  
  108. /*
  109.  * VOID Fail(char *text)
  110.  *
  111.  * prints *text to Output() and sets ReturnCode can do with OS1.1
  112.  *
  113.  */
  114.  
  115. VOID Fail(char *text)
  116. {
  117. CONST STATIC char header[] = BASENAME ": ";
  118. CONST STATIC char footer[] = ".\n";
  119.  
  120.    Write(Output(),header,sizeof(header)-1);
  121.    Write(Output(),text,strlen(text));
  122.    Write(Output(),footer,sizeof(footer)-1);
  123.  
  124.    ReturnCode = RETURN_FAIL;
  125. }
  126.  
  127. /*
  128.  * VOID Warning(char *text)
  129.  *
  130.  * prints *text to Output() and sets ReturnCode can do with OS1.1
  131.  *
  132.  */
  133.  
  134. VOID Warning(char *text)
  135. {
  136.    Fail(text);
  137.    ReturnCode = RETURN_WARN;
  138. }
  139.  
  140. /*
  141.  * BOOL CheckResidentList(char *name,BOOL system)
  142.  *
  143.  * searches the system/normal residentlist for *name
  144.  *
  145.  * returns TRUE if found
  146.  */
  147.  
  148. BOOL CheckResidentList(char *name,BOOL system)
  149. {
  150. struct Segment *segment;
  151. LONG uc;
  152. BOOL found = FALSE;
  153.  
  154.    if (Verbose)
  155.       Printf("searching %ls in %ls resident list\n",name, system ? "system" : "normal");
  156.  
  157.    Forbid();
  158.    if (segment = FindSegment(name,NULL,FALSE))
  159.       {
  160.       found = TRUE;
  161.       uc = segment->seg_UC;
  162.       };
  163.    Permit();
  164.  
  165.    if (found)
  166.       {
  167.       Printf("%ls found in %ls resident list (",name, system ? "system" : "normal");
  168.       switch (uc)
  169.          {
  170.          case CMD_SYSTEM:     Printf("system"); break;
  171.          case CMD_INTERNAL:   Printf("internal"); break;
  172.          case CMD_DISABLED:   Printf("disabled"); break;
  173.          default:             Printf("usercount = %ld",uc); break;
  174.          };
  175.       Printf(")\n\n");
  176.       };
  177.  
  178.    return found;
  179. }
  180.  
  181. /*
  182.  * BOOL CheckVersion(char *dir,char *file)
  183.  *
  184.  * tries to open the file *file in dir *dir, and searches for one or more
  185.  * Commodore Version, RCS ident or DUUCP-uident strings and prints them
  186.  *
  187.  * returns TRUE if file is found
  188.  */
  189.  
  190. BOOL CheckVersion(char *dir,char *file)
  191. {
  192. char buffer[MAXPATHLEN];
  193.  
  194.    strcpy(buffer,dir);
  195.    AddPart(buffer,file,MAXPATHLEN);
  196.  
  197.    if (Verbose)
  198.       Printf("searching %ls in %ls\n",file,buffer);
  199.  
  200.    BPTR fh = Open(buffer,MODE_OLDFILE);
  201.    if (fh)
  202.       {
  203.  
  204.       /* get realname block */
  205.       {
  206.       char realname[MAXPATHLEN];
  207.  
  208.       if (!NameFromFH(fh,realname,sizeof(realname)))
  209.          strcpy(realname,buffer);
  210.  
  211.       Printf("found %ls:\n   ", realname);
  212.       }
  213.  
  214.       /* examine fib block */
  215.       {
  216.       struct FileInfoBlock *fib = AllocVec(sizeof(struct FileInfoBlock),MEMF_ANY);
  217.       if (fib)
  218.          {
  219.          if (ExamineFH(fh,fib))
  220.             {
  221.             char strday[LEN_DATSTRING];
  222.             char strdate[LEN_DATSTRING];
  223.             char strtime[LEN_DATSTRING];
  224.             struct DateTime datetime;
  225.  
  226.             datetime.dat_Format  = FORMAT_DOS;
  227.             datetime.dat_Flags   = 0;
  228.             datetime.dat_StrDay  = strday;
  229.             datetime.dat_StrDate = strdate;
  230.             datetime.dat_StrTime = strtime;
  231.             CopyMem(&fib->fib_Date,&datetime.dat_Stamp,sizeof(struct DateStamp));
  232.  
  233.             char protection[8];
  234.             protection[7] = '\0';
  235.             protection[6] = (fib->fib_Protection & 1) ? '-' : 'd';
  236.             protection[5] = (fib->fib_Protection & 2) ? '-' : 'e';
  237.             protection[4] = (fib->fib_Protection & 4) ? '-' : 'w';
  238.             protection[3] = (fib->fib_Protection & 8) ? '-' : 'r';
  239.             protection[2] = (fib->fib_Protection & 16) ? 'a' : '-';
  240.             protection[1] = (fib->fib_Protection & 32) ? 'p' : '-';
  241.             protection[0] = (fib->fib_Protection & 64) ? 's' : '-';
  242.  
  243.             if (DateToStr(&datetime))
  244.                Printf("%ls %ls %ls ", strday,strdate,strtime);
  245.  
  246.             Printf("%ls %ld bytes %ls", protection, fib->fib_Size, fib->fib_Comment);
  247.             };
  248.  
  249.          FreeVec(fib);
  250.          };
  251.       }
  252.  
  253.       WriteChar('\n');
  254.  
  255.       /* examine binary block */
  256.       {
  257.       BOOL one = FALSE;    /* indicates a least one version string found */
  258.       LONG first;
  259.       while ((first = FGetC(fh))!=-1)
  260.          {
  261.          char temp[MAXLINELEN];
  262.  
  263.          if (first=='$' || first=='@')
  264.             {
  265.             char last = first;
  266.             LONG len = 1;
  267.             temp[0] = first;
  268.  
  269.             LONG c;
  270.             while ((c = FGetC(fh))!=-1)
  271.                {
  272.                temp[len++] = c;
  273.  
  274.                if (first=='@' && temp[1]!='(')
  275.                   break;
  276.  
  277.                if (c=='\0' || c=='\n' || (len==MAXLINELEN-1) || (c=='$' && first=='$'))
  278.                   {
  279.                   if (c=='$' && first=='$' && len>6)
  280.                      if (strncmp(&temp[1],"VER: ",5)==0)
  281.                         continue;
  282.                   last = c;
  283.                   break;
  284.                   };
  285.                };
  286.  
  287.             if (temp[len-1]=='\n') /* cut off newline */
  288.                len--;
  289.             temp[len] = '\0';
  290.  
  291.             if (first=='$' && (strncmp(&temp[1],"VER: ",5)==0) && (last=='\0' || last=='\n')) /* C= VER */
  292.                {
  293.                Printf("   Version : %ls\n", temp);
  294.                one = TRUE;
  295.                }
  296.             else if (first=='@' && (strncmp(&temp[1],"($)",3)==0) && last=='\0') /* uident */
  297.                {
  298.                Printf("   uident  : %ls\n", temp);
  299.                one = TRUE;
  300.                }
  301.             else
  302.                {
  303.                if (first=='$' && last=='$') /* RCS ident */
  304.                   {
  305.                   int i=1;
  306.                   while (isalpha(temp[i]) && i<len)
  307.                      i++;
  308.                   if (temp[i]==':')
  309.                      {
  310.                      Printf("   ident   : %ls\n", temp);
  311.                      one = TRUE;
  312.                      };
  313.                   };
  314.                };
  315.             };
  316.          };
  317.  
  318.       if (!one)
  319.          Printf("   no version string found\n");
  320.  
  321.       }
  322.  
  323.       if (!Close(fh))
  324.          Warning("closing file error");
  325.  
  326.       WriteChar('\n');
  327.  
  328.       return TRUE;
  329.       };
  330.  
  331.    return FALSE;
  332. }
  333.  
  334. /*
  335.  * BOOL CheckVersionMulti(char *dir,char *file)
  336.  *
  337.  * checks if *dir ends in ':' and checks for multiassigns if it is.
  338.  * calls CheckVersion() for every found directory
  339.  *
  340.  * returns TRUE if at least one CheckVersion() returns TRUE
  341.  */
  342.  
  343. BOOL CheckVersionMulti(char *dir,char *file)
  344. {
  345.    if (strlen(dir)>0)
  346.       {
  347.       if (dir[strlen(dir)-1]==':')
  348.          {
  349.          BOOL found = FALSE;
  350.          struct DevProc *devproc = NULL;
  351.  
  352.          if (devproc = GetDeviceProc(dir,NULL))
  353.             if (devproc->dvp_Lock)
  354.                {
  355.                devproc = NULL;
  356.  
  357.                if (Verbose)
  358.                   Printf("checking multiassigns for %ls\n",dir);
  359.  
  360.                while (devproc = GetDeviceProc(dir,devproc))
  361.                   {
  362.                   if (devproc->dvp_Lock)
  363.                      {
  364.                      char buffer[MAXPATHLEN];
  365.                      if (NameFromLock(devproc->dvp_Lock,buffer,sizeof(buffer)))
  366.                         {
  367.                         if (found = CheckVersion(buffer,file))
  368.                            if (!CheckAll)
  369.                               return TRUE;
  370.                         }
  371.                      else
  372.                         Warning("NameFromLock() failed");
  373.                      };
  374.                   };
  375.  
  376.                if (Verbose)
  377.                   Printf("\n");
  378.                }
  379.             else
  380.                found = CheckVersion(dir,file);
  381.  
  382.          return found;
  383.          };
  384.       };
  385.  
  386.    return CheckVersion(dir,file);
  387. }
  388.  
  389. /*
  390.  * ShowRev
  391.  *
  392.  * int main(int argc_notused,char **argv_notused)
  393.  *
  394.  */
  395.  
  396. int main(int argc_notused,char **argv_notused)
  397. {
  398.    if (DOSBase->dl_lib.lib_Version >= 37) /* at least AmigaOS 2.04 required */
  399.       {
  400.       LONG array[] = { NULL, FALSE, FALSE, FALSE };
  401.       struct RDArgs *rdargs = ReadArgs("NAME/A,ALL/S,VERBOSE/S",array,NULL);
  402.       if (rdargs)
  403.          {
  404.          STRPTR filename = (STRPTR)array[0];
  405.          CheckAll = array[1];
  406.          Verbose  = array[2];
  407.  
  408.          struct Task *task = FindTask(NULL);
  409.  
  410.          if (task->tc_Node.ln_Type==NT_PROCESS) /* should be TRUE for a CLI-command */
  411.             {
  412.             struct CommandLineInterface *CLI = BADDR(((struct Process *)task)->pr_CLI);
  413.  
  414.             if (CLI) /* should be true for a CLI-command too */
  415.                {
  416.                Printf("%ls\n\n",&VER[7]);
  417.  
  418.                BOOL found = FALSE;
  419.  
  420.                if (FilePart(filename)!=filename)   /* is this path qualified ? */
  421.                   {
  422.                   if (CheckVersion("",filename))   /* yes! so check it directly (worx only with 37 and up) */
  423.                      found = TRUE;
  424.  
  425.                   filename = FilePart(filename);   /* now its unqualified */
  426.                   };
  427.  
  428.                if (!found || CheckAll)
  429.                   {
  430.                   if (CheckResidentList(filename,FALSE))
  431.                      found = TRUE;
  432.  
  433.                   if (!found || CheckAll)
  434.                      {
  435.                      if (CheckResidentList(filename,TRUE))
  436.                         found = TRUE;
  437.  
  438.                      if (!found || CheckAll)
  439.                         {
  440.                         if (CheckVersion("",filename))
  441.                            found = TRUE;
  442.  
  443.                         if (!found || CheckAll)
  444.                            {
  445.                            struct PBLE *pble = BADDR(CLI->cli_CommandDir); /* PATH-list */
  446.                            while (pble)
  447.                               {
  448.                               char buffer[MAXPATHLEN];
  449.  
  450.                               if (NameFromLock(pble->DirLock,buffer,sizeof(buffer)))
  451.                                  {
  452.                                  if (CheckVersionMulti(buffer,filename))
  453.                                     found = TRUE;
  454.                                  }
  455.                               else
  456.                                  Warning("NameFromLock() failed");
  457.  
  458.                               if (found && !CheckAll)
  459.                                  break;
  460.  
  461.                               pble = BADDR(pble->Next);  /* check next path */
  462.                               };
  463.  
  464.                            if (!found || CheckAll)
  465.                               if (CheckVersionMulti("C:",filename))
  466.                                  found = TRUE;
  467.                            };
  468.                         };
  469.                      };
  470.                   };
  471.  
  472.                if (!found)
  473.                   Warning("no version found, file not in path");
  474.                }
  475.             else
  476.                Fail("not a CLI-process");
  477.             }
  478.          else
  479.             Fail("not a DOS-process");
  480.  
  481.          FreeArgs(rdargs);
  482.          }
  483.       else
  484.          {
  485.          PrintFault(IoErr(),Basename);
  486.          ReturnCode = RETURN_FAIL;
  487.          };
  488.       }
  489.    else
  490.       Fail("needs dos.library v37 or higher");
  491.  
  492.    return ReturnCode;
  493. }
  494.  
  495.